"""
应用命令模块
定义Flask CLI命令，用于数据库管理、用户管理等
"""
import click
from flask.cli import with_appcontext
from app.extensions import db
from app.models.user import User, UserRole
from app.models.product import Product, ProductStatus
from app.models.logistics import LogisticsProvider
from app.utils.fake_data import create_all_fake_data

def register_commands(app):
    """注册命令到Flask应用
    
    Args:
        app: Flask应用实例
    """
    app.cli.add_command(create_admin)
    app.cli.add_command(init_db)
    app.cli.add_command(drop_db)
    app.cli.add_command(seed_db)

@click.command('create-admin')
@click.option('--username', default='admin', help='管理员用户名')
@click.option('--password', default='Admin123!', help='管理员密码')
@click.option('--email', default='admin@example.com', help='管理员邮箱')
@with_appcontext
def create_admin(username, password, email):
    """创建管理员账号"""
    try:
        # 检查管理员是否已存在
        admin = User.query.filter_by(username=username).first()
        if admin:
            click.echo(f'管理员 {username} 已存在')
            return
        
        # 创建管理员
        admin = User(
            username=username,
            email=email,
            full_name='系统管理员',
            role=UserRole.ADMIN.value,
            is_active=True
        )
        admin.set_password(password)
        
        db.session.add(admin)
        db.session.commit()
        click.echo(f'管理员 {username} 创建成功')
    except Exception as e:
        click.echo(f'创建管理员失败: {str(e)}')

@click.command('init-db')
@with_appcontext
def init_db():
    """初始化数据库，创建所有表"""
    try:
        db.create_all()
        click.echo('数据库表创建成功')
    except Exception as e:
        click.echo(f'创建数据库表失败: {str(e)}')

@click.command('drop-db')
@click.confirmation_option(prompt='确定要删除所有数据库表吗？此操作不可恢复！')
@with_appcontext
def drop_db():
    """删除所有数据库表"""
    try:
        db.drop_all()
        click.echo('数据库表删除成功')
    except Exception as e:
        click.echo(f'删除数据库表失败: {str(e)}')

@click.command('seed-db')
@click.option('--sample', is_flag=True, help='是否只创建少量样例数据')
@with_appcontext
def seed_db(sample):
    """填充示例数据到数据库"""
    try:
        # 创建测试用户
        if not User.query.filter_by(username='test').first():
            test_user = User(
                username='test',
                email='test@example.com',
                full_name='测试用户',
                role=UserRole.USER.value,
                is_active=True
            )
            test_user.set_password('Test123!')
            db.session.add(test_user)
        
        # 创建一些物流服务商
        if LogisticsProvider.query.count() == 0:
            logistics_providers = [
                LogisticsProvider(name='顺丰速运', contact='95338', website='https://www.sf-express.com'),
                LogisticsProvider(name='中通快递', contact='95311', website='https://www.zto.com'),
                LogisticsProvider(name='圆通速递', contact='95554', website='https://www.yto.net.cn'),
                LogisticsProvider(name='申通快递', contact='95543', website='https://www.sto.cn'),
                LogisticsProvider(name='韵达速递', contact='95546', website='https://www.yundaex.com')
            ]
            db.session.add_all(logistics_providers)
        
        # 创建一些产品
        if Product.query.count() == 0:
            products = [
                Product(
                    name='测试商品1',
                    description='这是一个测试商品',
                    price=99.99,
                    stock=100,
                    sku='TEST-SKU-001',
                    status=ProductStatus.ACTIVE.value
                ),
                Product(
                    name='测试商品2',
                    description='这是另一个测试商品',
                    price=199.99,
                    stock=50,
                    sku='TEST-SKU-002',
                    status=ProductStatus.ACTIVE.value
                )
            ]
            db.session.add_all(products)
        
        db.session.commit()
        
        # 如果需要创建更多测试数据
        if not sample:
            data = create_all_fake_data()
            click.echo(f"已创建 {len(data['users'])} 个用户")
            click.echo(f"已创建 {len(data['providers'])} 个物流服务商")
            click.echo(f"已创建 {len(data['products'])} 个商品")
            click.echo(f"已创建 {len(data['orders'])} 个订单")
            click.echo(f"已创建 {len(data['records'])} 条库存记录")
        else:
            click.echo('样例数据创建成功')
        
    except Exception as e:
        db.session.rollback()
        click.echo(f'填充示例数据失败: {str(e)}')

# 确保command在__init__.py导入时可见
__all__ = ['register_commands'] 